package day250703

import (
	"container/list"
	"fmt"
)

func List的使用() {

	//数组--切片--list 三者区别

	/*
		数组：
		固定长度的连续内存块。
		值类型，赋值或传参会复制整个数组。

		切片：
		动态长度的视图，底层基于数组。
		引用类型（实际是 struct { ptr *array, len int, cap int }），传参时共享底层数据

		数组：[3]int 和 [5]int 是不同的类型。

		切片：[]int 是统一类型，与长度无关

		. 操作灵活性
		数组：长度不可变，无法动态增删元素。
		切片：支持动态增删（append、slice[low:high] 截取），更灵活。

		内存分配
		数组：值类型，赋值或传参时会复制整个数组。
		arrA := [3]int{1, 2, 3}
		arrB := arrA // 复制整个数组
		切片：引用类型（底层是数组指针），赋值或传参时仅复制结构体（指针、长度、容量），不复制数据。
		sliceA := []int{1, 2, 3}
		sliceB := sliceA // 共享底层数组

		list.List：
		双向链表（非连续内存）。
		每个节点（Element）包含 Value、Prev 和 Next 指针。
		引用类型，传参时仅复制链表头指针。

		特性			数组/切片					 list.List
		长度		固定（数组）或动态（切片）			动态
		访问方式	索引（arr[0]）					   必须遍历（Front() + Next()）
		插入/删除	切片需移动元素（O(n)）				链表节点操作（O(1)）
		内存开销	较低（连续内存）					较高（每个元素带指针）
		适用场景	随机访问、固定/动态集合				频繁插入/删除、不确定长度

		. 内存布局
		数组/切片：数据在连续内存中存储，随机访问快（O(1)）。
		链表：数据分散存储，通过指针连接，随机访问慢（O(n)），但插入/删除高效（O(1) 在已知位置时）。

		如何选择？

		用数组/切片：
		需要快速随机访问（如查找第 i 个元素）。
		数据长度固定或可预测（避免切片频繁扩容）。
		内存局部性重要（如高性能计算）。
		用 list.List：
		频繁在中间插入/删除元素（如实现队列、栈）。
		长度不确定或动态变化较大。
		不需要频繁索引访问。

	*/

	//实例化list
	mylist := list.New()
	fmt.Println(mylist) //&{{0xc00001e930 0xc00001e930 <nil> <nil>} 0}

	//添加
	mylist.PushFront("a")                   //["a"]
	mylist.PushBack("b")                    //["a","b"]
	mylist.PushBack("c")                    //["a","b","c"]
	mylist.InsertBefore("d", mylist.Back()) //["a","b","d","c"]
	mylist.InsertAfter("e", mylist.Front()) //[a,e,b,d,c]

	//遍历
	for e := mylist.Front(); e != nil; e = e.Next() {
		fmt.Print(e.Value, " ")
	}

	fmt.Println("")

	mylist.Remove(mylist.Front())

	//遍历
	for e := mylist.Front(); e != nil; e = e.Next() {
		fmt.Print(e.Value, " ")
	}
	fmt.Println("")
}
